/**
 * Copyright © 2015 eqxiu.com 北京中网易企秀科技有限公司  All rights reserved.
 */
package com.eqxiu.ieditor.api.controller.scene;

import com.eqxiu.ieditor.api.IElementTagServiceApi;
import com.eqxiu.ieditor.api.IPageTagServiceApi;
import com.eqxiu.ieditor.api.ISceneTagServiceApi;
import com.eqxiu.ieditor.api.ITagServiceApi;
import com.eqxiu.ieditor.api.controller.BaseApiController;
import com.eqxiu.ieditor.api.controller.scene.doc.TagDoc;
import com.eqxiu.ieditor.commons.web.MsgCode;
import com.eqxiu.ieditor.commons.web.ResultData;
import com.eqxiu.ieditor.dto.ElementTagDTO;
import com.eqxiu.ieditor.dto.PageTagDTO;
import com.eqxiu.ieditor.dto.SceneTagDTO;
import com.eqxiu.ieditor.dto.TagDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;

/**
 * @author ranger
 * @description 标签接口
 * @update lifen
 * @date May 31, 2017
 */
@RestController
@RequestMapping("/api/m/tag")
public class TagController implements TagDoc, BaseApiController {

    @Autowired
    private ITagServiceApi tagServiceApi;
    @Autowired
    private ISceneTagServiceApi sceneTagServiceApi;
    @Autowired
    private IPageTagServiceApi pageTagServiceApi;
    @Autowired
    private IElementTagServiceApi elementTagServiceApi;

    @GetMapping("/list")
    @Override
    public ResultData getTagList(@RequestParam("bizType") int bizType) {
        List<TagDTO> list = tagServiceApi.getTagsByBizType((byte) bizType);
        if (list.isEmpty()) {
            return fail().setCode(MsgCode.DATA_NOT_EXIST).setMsg("tag not exist!");
        }
        return success().setList(list);
    }

    @GetMapping("/page/{pageId}/tag")
    @Override
    public ResultData getPageTagByPageId(@PathVariable Long pageId) {

        List<PageTagDTO> list = pageTagServiceApi.selectByPageId(pageId);
        if (list.isEmpty()) {
            return fail();
        }
        return success().setObj(list);
    }

    @GetMapping("/pageTags/{sceneTagId}")
    @Override
    public ResultData getPageTagListBySceneTagId(@PathVariable("sceneTagId") Integer tagId) {
        List<SceneTagDTO> list = sceneTagServiceApi.selectByTagId(tagId);
        if (!list.isEmpty()) {
            SceneTagDTO tagDTO = list.get(0);
            List<PageTagDTO> pageTagOpt = pageTagServiceApi.selectBySceneId(tagDTO.getSceneId());
            if (!pageTagOpt.isEmpty()) {
                return success().setList(pageTagOpt);
            }
        }
        return success().setList(tagServiceApi.getTagsByBizType((byte) 2));
    }

    @PostMapping("/setScene")
    @Override
    public ResultData setSceneTag(@RequestParam("tagId") Integer tagId, @RequestParam Long sceneId) {

        TagDTO tagDTO = tagServiceApi.getOne(tagId);
        if (tagDTO==null) {
            return fail().setCode(MsgCode.DATA_NOT_EXIST).setMsg("tag not exist");
        }
        SceneTagDTO record = new SceneTagDTO();
        if (tagDTO.getBizType()!=null){
            int bizType = tagDTO.getBizType();
            if (bizType != 1) {
                return fail().setCode(MsgCode.CONSTRAINT_VIOLATION).setMsg("not a scene tag");
            }
            record.setTagId(tagId);
            record.setSceneId(sceneId);
            sceneTagServiceApi.insert(record);
        }
        return success().setObj(record);
    }

    @PostMapping("/unsetScene")
    @Override
    public ResultData unsetSceneTag(@RequestParam("tagId") Integer tagId, @RequestParam Long sceneId) {

        TagDTO tagDTO = tagServiceApi.getOne(tagId);
        if (tagDTO == null) {
            return fail().setCode(MsgCode.DATA_NOT_EXIST).setMsg("tag not exist");
        }
        if (tagDTO.getBizType()!=null){
            final int bizType = tagDTO.getBizType();
            if (bizType != 1) {
                return fail().setCode(MsgCode.CONSTRAINT_VIOLATION).setMsg("not a scene tag");
            }
            sceneTagServiceApi.deleteByPrimaryKey(sceneId);
        }
        return success();
    }

    @PostMapping("/setPage")
    @Override
    public ResultData setPageTag(@RequestParam("tagId") Integer tagId, @RequestParam("sceneId") Long sceneId,
                                 @RequestParam("pageId") Long pageId) {
        TagDTO tagDTO = tagServiceApi.getOne(tagId);
        if (tagDTO == null) {
            return fail().setCode(MsgCode.DATA_NOT_EXIST).setMsg("tag not exist");
        }
        PageTagDTO record = new PageTagDTO();
        if (tagDTO.getBizType()!=null){
            final int bizType = tagDTO.getBizType();
            if (bizType != 2) {
                return fail().setCode(MsgCode.CONSTRAINT_VIOLATION).setMsg("not a page tag");
            }
            record.setTagId(tagId);
            record.setPageId(pageId);
            record.setSceneId(sceneId);
            pageTagServiceApi.insert(record);
        }
        return success().setObj(record);
    }

    @PostMapping("/unsetPage")
    @Override
    public ResultData unsetPageTag(@RequestParam("tagId") Integer tagId, @RequestParam("pageId") Long pageId) {

        TagDTO tagDTO = tagServiceApi.getOne(tagId);
        if (tagDTO == null) {
            return fail().setCode(MsgCode.DATA_NOT_EXIST).setMsg("tag not exist");
        }
        if (tagDTO.getBizType()!=null){
            final int bizType = tagDTO.getBizType();
            if (bizType != 2) {
                return fail().setCode(MsgCode.CONSTRAINT_VIOLATION).setMsg("not a page tag");
            }
            pageTagServiceApi.deleteByPrimaryKey(pageId);
        }
        return success();
    }

    @GetMapping("/getPages")
    @Override
    public ResultData getPageByTag(@RequestParam("tagId") Integer tagId) {

        TagDTO tagDTO = tagServiceApi.getOne(tagId);
        if (tagDTO == null) {
            return fail().setCode(MsgCode.DATA_NOT_EXIST).setMsg("tag not exist");
        }
        if ( tagDTO.getBizType()!=null){
            final int bizType = tagDTO.getBizType();
            if (bizType != 2) {
                return fail().setCode(MsgCode.CONSTRAINT_VIOLATION).setMsg("not a page tag");
            }
            List<PageTagDTO> pages = pageTagServiceApi.selectByTagId(tagId);
            if (!pages.isEmpty()) {
                return success().setList(pages);
            }
        }
        return success().setList(new ArrayList<>());
    }

    @PostMapping("/setElement")
    @Override
    public ResultData setElementTag(@RequestParam("tagId") Integer tagId, @RequestParam("pageId") Long pageId,
                                    @RequestParam("elementId") Long elementId) {
        TagDTO tagDTO = tagServiceApi.getOne(tagId);
        if (tagDTO == null) {
            return fail().setCode(MsgCode.DATA_NOT_EXIST).setMsg("tag not exist");
        }
        ElementTagDTO record = new ElementTagDTO();
        if (tagDTO.getBizType()!=null){
            final int bizType = tagDTO.getBizType();
            if (bizType != 3) {
                return fail().setCode(MsgCode.CONSTRAINT_VIOLATION).setMsg("not a page element tag");
            }
            record.setTagId(tagId);
            record.setPageId(pageId);
            record.setElementId(elementId);
            elementTagServiceApi.insert(record);
        }
        return success().setObj(record);
    }

    @Override
    @PostMapping("/unsetElement")
    public ResultData unsetElementTag(Integer tagId, Long pageId, Long elementId) {
        TagDTO tagDTO = tagServiceApi.getOne(tagId);
        if (tagDTO == null) {
            return fail().setCode(MsgCode.DATA_NOT_EXIST).setMsg("tag not exist");
        }
        if (tagDTO.getBizType()!=null){
            final int bizType = tagDTO.getBizType();
            if (bizType != 3) {
                return fail().setCode(MsgCode.CONSTRAINT_VIOLATION).setMsg("not a page element tag");
            }
            elementTagServiceApi.deleteByPrimaryKey(pageId, elementId);
        }
        return success();
    }

    @Override
    @GetMapping("/getScenes")
    public ResultData getSceneByTag(@RequestParam Integer tagId) {
        TagDTO tagDTO = tagServiceApi.getOne(tagId);
        if (tagDTO == null) {
            return fail().setCode(MsgCode.DATA_NOT_EXIST).setMsg("tag not exist");
        }
        if (tagDTO.getBizType()!=null){
            final int bizType = tagDTO.getBizType();
            if (bizType != 1) {
                return fail().setCode(MsgCode.CONSTRAINT_VIOLATION).setMsg("not a scene tag");
            }
            List<SceneTagDTO> list = sceneTagServiceApi.selectByTagId(tagId);
            if (!list.isEmpty()) {
                return success().setList(list);
            }
        }
        return success().setList(new ArrayList<>());
    }
}
